﻿#ifndef SHOWPLATFORM_H
#define SHOWPLATFORM_H

#include <QWidget>
#include <QFile>
#include <QFileDialog>
#include <QMessageBox>
#include <QFile>
#include <QtXml>
#include <QDomDocument>
#include <algorithm>
#include <QMap>
#include <QDir>
#include <mutex>
#include <thread>
#include <cstdlib>
#include <algorithm>
#include <sstream>
#include "addplatform.h"
#include "AddType.h"
#include "pugixml.hpp"
#define WIDTH 800
#define HEIGHT 600
QT_BEGIN_NAMESPACE
namespace Ui { class ShowPlatform; }
QT_END_NAMESPACE

class ShowPlatform : public QWidget
{
    Q_OBJECT

public:
    ShowPlatform(QWidget *parent = nullptr);
    ~ShowPlatform();
private slots:
    void on_openBtn_clicked();
    void on_AddBtn_clicked();
private:
    void addInterface(int Eventtype);//添加统一接口
    void addEvent(int Eventtype); //添加事件
    void addParm(int Eventtype); //添加参数
    void addAgent(int Eventtype); //添加智能体
private:
    void removeEvent(map<int, map<QString, QStringList>> &Data_Map); //移除事件
    void removeParm(map<int, map<QString, QStringList>> &Data_Map); //移除参数
    void removeAgent(map<int, map<QString, QStringList>> &Data_Map); //移除智能体
private:
    void modInterface(int Eventtype, map<int, map<QString, QStringList>> &Data_Map);//修改统一接口
    void modEvent(int Eventtype, map<int, map<QString, QStringList>> &Data_Map); //修改事件
    void modParm(int Eventtype, map<int, map<QString, QStringList>> &Data_Map); //修改参数
    void modAgent(int Eventtype, map<int, map<QString, QStringList>> &Data_Map); //修改智能体
private:
    void generateAllXml();//生成最终所有的xml文件接口
private:
    bool InitTMap(int EventType);//初始化T_map
    void InitmMap();//初始化m_map
    void openneedtemplateXmls(QString filepath, vector<QString> &v);//打开指定模版下的所有.xml文件
    QString gettemplatexml(QString &filepath);
    void getgeneratealppath(QString &xmlpath);//获取制定xml文件下的上一级路径
private:
    bool loadfile(pugi::xml_document &Doc, const char *filename);//加载指定文件
    bool savefile(pugi::xml_document &Doc, const char *filename);//保存指定文件
    pugi::xml_node findtargetNode(const char *targetNodeName);//寻找指定名称节点
    bool appendXmlToNode(const char *targetNodeName, QString &content);//将xml内容添加到指定名称节点下
    void addXmlToNode(pugi::xml_node& parentNode, QString& xmlContent);//将xml内容添加到指定名称节点下
    void addNodeToNode(pugi::xml_node& parentNode, const QString& targetNodename);//将指定名称节点添加到指定节点下
    bool modifyXmlNodeData(int &page, vector<QString> &xmlcontent, map<QString, QStringList> &Data_Map);
    void modifyXmlData(int ans, pugi::xml_node &targetNode, QStringList &value, vector<QString> &xmlcontent);
    int findWitchtemplatexml(int &page, QString &key, QStringList &value, vector<QString> &xmlcontent);
    void modifyRecursive(int i, pugi::xml_node node, QString &key, QStringList &value, vector<QString> &xmlcontent);
    void modifyRecursive(int i, std::vector<QString> &RootVec, pugi::xml_node node, QStringList &value, vector<QString> &xmlcontent);
    bool ismodfiyNodeData(std::vector<QString> &RootVec, pugi::xml_node node);
private:
    void Init();//初始化
    void addAllchildnodes(AddEv *addev);//添加所有节点
    void ModAllchildnodes(AddEv *addev, map<int, map<QString, QStringList>> &Data_Map);//修改所有节点
    void RemoveAllchildnodes(AddEv *addev, map<int, map<QString, QStringList>> &Data_Map);//删除所有节点
private:
    vector<QString> v;//存储.xml文件内容
    AddPlatform *_addform;
    pugi::xml_document existingDoc;//空白文件
//    pugi::xml_document templateDoc;
    bool isopen = false;//是否加载过现有空白文件的标志
    map<QString, vector<QString>> m;//存储 _name ---> 所在模版的所有模版的字符串
    map<int, map<QString, vector<QString>>> T_map;
    std::mutex mtx;
    QString filepath;//模版路径
    QByteArray jsonData;
    QJsonParseError error;
    QJsonDocument doc;
    pugi::xml_document xml_doc;
    pugi::xml_node targetNode;//目标节点
    ParsexmlIns *P_ins;
    map<QString, QStringList> Root_map;//存储 对应模版(_name ---> template)---> 添加的根节点名称
    map<int, QStringList> Res_Map; //存储所有排序结果
    map<QString, QString> TemPath_Map; //存储指定名称的模版路径
    QString _name;//事务名称
    QString xmlcontent;
    bool isopenxml = false;//是否打开过xml标志
private:

    Ui::ShowPlatform *ui;
};
#endif // SHOWPLATFORM_H
